package org.xserver.disruptor.dsl.stubs;

import com.lmax.disruptor.util.DaemonThreadFactory;
import java.util.Collection;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

public class StubExecutor implements Executor {

    private final DaemonThreadFactory threadFactory = DaemonThreadFactory.INSTANCE;
    private final Collection<Thread> threads = new CopyOnWriteArrayList<Thread>();
    private final AtomicBoolean ignoreExecutions = new AtomicBoolean(false);
    private final AtomicInteger executionCount = new AtomicInteger(0);
    
    public void execute(final Runnable command) {
        executionCount.getAndIncrement();
        if (!ignoreExecutions.get()) {
            Thread t = threadFactory.newThread(command);
            t.setName(command.toString());
            threads.add(t);
            t.start();
        }
    }

    public void joinAllThreads() {
        for (Thread thread : threads) {
            if (thread.isAlive()) {
                try {
                    thread.interrupt();
                    thread.join(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
          //  Assert.assertFalse("Failed to stop thread: " + thread, thread.isAlive());
        }

        threads.clear();
    }

    public void ignoreExecutions() {
        ignoreExecutions.set(true);
    }

    public int getExecutionCount() {
        return executionCount.get();
    }

	
}
